package gui;

import dao.FileMeta;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import service.SearchService;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

public class GUIController implements Initializable {
    @FXML
    private GridPane gridPane;

    @FXML
    private Button button;

    @FXML
    private Label label;

    @FXML
    private TextField textField;

    @FXML
    private TableView<FileMeta> tableView;

    private SearchService service = null;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 在这里给输入框加上一个监听器
        // 需要指定是针对 text 的内容变化来监听
        textField.textProperty().addListener(new ChangeListener<String>() {

            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                // 这个方法在用户每次修改输入框的内容的时候, 自动调用到
                // oldValue 是输入框被改之前旧的值是什么
                // newValue 是输入框改完之后新的值是什么
                // 此处要做的事情是根据这个新的值进行查询操作
                freshTable(newValue);
            }
        });
    }

    private void freshTable(String query) {
        // 重新查询数据库, 把查询结果设置到表格中
        // 查询操作依赖 SearchService 对象
        if (service == null) {
            System.out.println("SearchService 尚未初始化, 不能查询");
            return;
        }
        // 先把表格之中的数据给清空, 就需要拿到 tableView 内部的集合类
        ObservableList<FileMeta> fileMetas = tableView.getItems();
        // 清空之前的内容
        fileMetas.clear();
        List<FileMeta> res = service.search(query);
        // 把结果添加到 TableView 中
        fileMetas.addAll(res);
    }

    // 使用这个方法作为鼠标点击事件的回调方法. 当前方法需要有一个 MouseEvent 参数
    public void choose(MouseEvent mouseEvent) {
//        System.out.println("点击了按钮");
        // 创建出目录选择器对象
        DirectoryChooser chooser = new DirectoryChooser();

        // 把对话框显示出来
        Window window = gridPane.getScene().getWindow();
        File file = chooser.showDialog(window);
        if (file == null) {
            System.out.println("当前选择路径为空");
            return;
        }
        System.out.println(file.getAbsolutePath());

        // 让用户选择的路径显示到 label 标签中
        label.setText(file.getAbsolutePath());

        // 判断一下 searchService 是否是空的, 如果非空, 说明现在不是程序首次扫描
        // 停止上次的扫描任务
        if (service != null) {
            service.shutDown();
        }
        // 让用户选择路径是为了让程序指定路径扫描, 把对应的数据加入到数据库中
        service = new SearchService();
        service.init(file.getAbsolutePath());
    }
}
